package tk.uodrad.apex.project.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import tk.uodrad.apex.project.ex.ServiceException;
import tk.uodrad.apex.project.pojo.dto.RepairAddNewDTO;
import tk.uodrad.apex.project.pojo.dto.RepairUpdateDTO;
import tk.uodrad.apex.project.pojo.entity.ActivityManagement;
import tk.uodrad.apex.project.pojo.entity.People;
import tk.uodrad.apex.project.pojo.entity.Repair;
import tk.uodrad.apex.project.pojo.entity.Repair;
import tk.uodrad.apex.project.pojo.vo.RepairDashboardVO;
import tk.uodrad.apex.project.pojo.vo.RepairListVO;
import tk.uodrad.apex.project.service.RepairService;
import tk.uodrad.apex.project.mapper.RepairMapper;
import org.springframework.stereotype.Service;
import tk.uodrad.apex.project.web.ServiceCode;

import java.util.Date;
import java.util.List;

/**
* @author Administrator
* @description 针对表【repair_management】的数据库操作Service实现
* @createDate 2023-04-08 17:34:21
*/
@Service
@Slf4j
public class RepairServiceImpl extends ServiceImpl<RepairMapper, Repair>
    implements RepairService{

    @Autowired
    private RepairMapper repairMapper;

    @Override
    public void setEnable(Long id) {
        log.debug("开始处理【启用活动】的业务，参数：{}", id);
        updateEnableById(id, 1);
    }

    @Override
    public void setDisable(Long id) {
        log.debug("开始处理【禁用活动】的业务，参数：{}", id);
        updateEnableById(id, 0);
    }

    private void updateEnableById(Long id, Integer state) {
        // 调用Mapper对象的selectById()方法执行查询
        Repair current = repairMapper.selectById(id);
        // 判断查询结果是否为null，如果是，则抛出异常
        if (current == null) {
            String message = ENABLE_TEXT[state] + "保修失败，保修数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_NOT_FOUND, message);
        }

        // 判断查询结果中的enable与参数enable是否相同，如果是，则抛出异常（当前状态与目标状态相同，没必要执行更新）
        if (current.getState() == state) {
            String message = ENABLE_TEXT[state] + "活动失败，此活动已经处于" + ENABLE_TEXT[state] + "状态！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_CONFLICT, message);
        }

        // 创建ActivityManagement对象
        Repair update = new Repair();
        // 向Category对象中封装属性值：id, enable，均来自方法参数
        update.setState(state);
        //创建MyBatis-plus提供的Wrappers类下的query()方法
        QueryWrapper<Repair> wrapper = Wrappers.query();
        //用eq方法用于判断数据库中是否有id等于当前ActivityManagement的id（其他模块一般根据实际情况判断数据是否存在）
        wrapper.eq("id", id);
        // 调用Mapper对象的update()方法执行更新
        int rows = repairMapper.update(update, wrapper);
        if (rows != 1) {
            String message = ENABLE_TEXT[state] + "活动失败，服务器忙，请稍后再尝试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_UPDATE, message);
        }
    }

    @Override
    public void save(RepairAddNewDTO repairAddNewDTO) {
        log.debug("开始处理【添加报修】的业务，参数：{}", repairAddNewDTO);

        // 创建Repair对象
        Repair repair = new Repair();
        // 调用BeanUtils.copyProperties(源,目标)将参数对象中的属性复制到Repair对象中
        BeanUtils.copyProperties(repairAddNewDTO, repair);
        //给Repair对象赋值创建时间
        repair.setGmtCreate(new Date());
        // 调用Mapper对象的insert()执行插入数据
        log.debug("即将执行插入数据，参数：{}", repair);
        int rows = repairMapper.insert(repair);
        if (rows != 1) {
            String message = "服务器忙，请稍后再试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_INSERT, message);
        }
    }

    @Override
    public void updateById(RepairUpdateDTO repairUpdateDTO) {
        // 获取要修改的数据的id
        Long id = repairUpdateDTO.getId();
        log.debug("开始处理【修改报修】的业务，ID：{}，新数据：{}", id, repairUpdateDTO);
        // 调用Mapper对象的getStandardById()执行查询
        Repair repairById = repairMapper.selectById(id);
        // 判断查询结果是否为null
        if (repairById == null) {
            // 是：抛出异常
            String message = "修改报修失败，尝试修改的报修数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_NOT_FOUND, message);
        }
        
        // 创建Repair对象
        Repair repair = new Repair();
        // 复制属性，设置ID
        BeanUtils.copyProperties(repairUpdateDTO, repair);
        repair.setId(id);
        //给people对象赋值创建时间
        repair.setGmtModified(new Date());
        // 调用Mapper对象的update()方法执行修改
        int rows = repairMapper.updateById(repair);
        if (rows != 1) {
            String message = "服务器忙，请稍后再试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_UPDATE, message);
        }
    }

    /**
     * 分页查询成员列表
     * @param pageNum 第几页
     * @param pageSize 每页多少条数据
     * @param communityCode 小区编号
     * @return IPage<RepairListVO> PeopleListVO分页对象
     */
    @Override
    public IPage<RepairListVO> list(Integer pageNum, Integer pageSize, String communityCode) {
        Page<Repair> page = new Page<>(pageNum, pageSize);
        return repairMapper.selectPageVO(page,communityCode);
    }

    @Override
    public List<RepairDashboardVO> listDashboard() {
        return repairMapper.selectDashboard();
    }



}




